package com.peng.crm.settings.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.peng.crm.commons.exception.CustomException;
import com.peng.crm.commons.utils.UUIDUtil;
import com.peng.crm.settings.dao.DicValueDao;
import com.peng.crm.settings.entity.DicValue;
import com.peng.crm.settings.service.DicValueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 用户表(DicValue)表服务实现类
 *
 * @author makejava
 * @since 2022-06-27 15:44:00
 */
@Service
public class DicValueServiceImpl implements DicValueService {
    @Autowired
    private DicValueDao dicValueDao;

    /**
     * 注入RedisTemplate对象
     */
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public DicValue findById(String id) {
        return dicValueDao.selectById(id);
    }

    /**
     * 验证字典值,是否重复
     *
     * @param typeCode 字典类型编码，外键
     * @param value 字典值，不能为空，并且要求同一个字典类型下字典值不能重复，具有唯一性。
     * @return 实例对象
     */
    @Override
    public DicValue findTypeCode(String typeCode, String value) {
        return dicValueDao.selectByType(typeCode,value);
    }

    @Override
    public DicValue findByType(String id) {
        return dicValueDao.selectById(id);
    }

    /**
     * 分页查询
     *
     * @param pageNumber 当前页码
     * @param pageSize 每页条数
     * @param dicValue 筛选条件
     * @return 查询结果
     */
    @Override
    public Map<String, Object> listPage(Integer pageNumber, Integer pageSize,DicValue dicValue) {
        PageHelper.startPage(pageNumber,pageSize);
        PageInfo<DicValue> pageInfo = new PageInfo<>(dicValueDao.select(dicValue));
        Map<String, Object> pageMap = new HashMap<>();
        pageMap.put("list",pageInfo.getList());
        pageMap.put("total",pageInfo.getTotal());
        return pageMap;
    }

    /**
     * 查询所有用户信息
     *
     * @return  查询结果集
     */
    @Override
    public List<DicValue> list(DicValue dicValue) {
        List<DicValue> list = null;
        if (dicValue != null && StringUtils.hasLength(dicValue.getTypeCode())){
            //判断redis中是否有缓存数据
            list = (List<DicValue>) redisTemplate.opsForValue().get("sys:dicValue:"+dicValue.getTypeCode());
            //list为null没有缓存数据
            if (CollectionUtils.isEmpty(list)) {
                //查询数据库
                list = dicValueDao.select(dicValue);
                //将查询到的数据存入redis缓存中
                // redisTemplate.opsForValue().set("sys:dicValue:"+dicValue.getTypeCode(),list);
                //为redis的key设置缓存过期时间
                redisTemplate.opsForValue().set("sys:dicValue:"+dicValue.getTypeCode(),list,7200, TimeUnit.SECONDS);

            }else {
                //如果有缓存数据则直接返回缓存数据，不在查询数据库
                return list;
            }
        }else {
            list = dicValueDao.select(dicValue);
        }
        return list;
    }

    /**
     * 新增数据
     *
     * @param dicValue 实例对象
     * @return 对象或null
     */
    @Override
    public boolean save(DicValue dicValue) {
        //判断同一个字典类型编码下字典值value不能重复
        DicValue dbDicValue = dicValueDao.selectByType(dicValue.getTypeCode(),dicValue.getValue());
        if (dbDicValue != null){
            //使用自定义异常抛出
            throw new CustomException(-20,"数据字典类型的字典值已存在");
        }
        dicValue.setId(UUIDUtil.getUUID());
        boolean result = dicValueDao.insert(dicValue) > 0;
        //清除缓存
        redisTemplate.delete("sys:dicValue:"+dicValue.getTypeCode());
        return result;

    }

    /**
     * 修改数据
     *
     * @param dicValue 实例对象
     * @return true 或 false
     */
    @Override
    public boolean edit(DicValue dicValue) {
        boolean result = dicValueDao.update(dicValue) > 0;
        //清除缓存
        redisTemplate.delete("sys:dicValue:"+dicValue.getTypeCode());
        return result;
    }

    /**
     * 通过主键删除数据
     *
     * @param code 主键
     * @return 是否成功
     */
    @Override
    public boolean remove(String code) {
        Boolean result = dicValueDao.deleteById(code) > 0;
        return result;
    }

    /**
     * 通过主键删除数据
     *
     * @param ids 主键
     * @return 是否成功
     */
    @Override
    public boolean removeBatch(String[] ids) {
        return dicValueDao.deleteBatch(ids) > 0;
    }
}
